class fileUploadAndDownload {
  constructor() {}
  judgeDataType(val) {//判断数据类型
    return Object.prototype.toString.call(val).slice(8, -1);
  }
  introduce() {
    console.log(`
      1.formDataUpData:上传文件方法=>上传方法介绍:fud.formDataUpDataIntroduce()
      2.downloadFileUseALabel:下载文件通过a标签-不传参=>下载方法介绍:fud.downloadFileUseALabelIntroduce()
      3.downloadFileUseALabelWithParams:下载文件通过a标签-传参=>下载方法介绍:fud.downloadFileUseALabelWithParamsIntroduce()
      4.downloadFileUseFormLabel:下载文件通过form标签=>下载方法介绍:fud.downloadFileUseFormLabelIntroduce()
      5.downloadFileUseFormLabelSplitParams:下载文件通过form标签=>下载方法介绍:fud.downloadFileUseFormLabelSplitParamsIntroduce
      6.downloadFileUseAjaxParamsIntroduce:下载文件通过Ajax请求(下载excel文件)=>下载方法介绍:fud.downloadFileUseAjaxParamsIntroduce
    `);
  }
  //#region - 手动上传文件
  formDataUpDataIntroduce() {
    console.log(
      `
        功能:解决文件手动上传的问题
        参数:
          http:发送ajax请求的方法
          url:文件上传地址
          obj:{
            name:文件名,
            file:文件流,
            ...
          }
        返回值:
          res:200的返回值
          err:500的返回值
        使用示例:
        fud.formDataUpDataIntroduce(axios,文件上传路径,{
          name:文件名,
          file:文件流,
          ...
        }).then(res=>{
          console.log(res,'文件上传成功之后触发的方法')
        }).catch(err=>{
          console.log(err,'文件上传失败之后触发的方法')
        })
      `
    );
  }
  /**
   * 功能:解决文件手动上传的问题
   * 参数:
   *    http:发送ajax请求
   *    baseUrl:公共的URL地址
   *    obj:参数集合
   *        url:接口请求地址
   * 返回值:
   *    res:200的返回值
   *    err:200的返回值
   * 使用示例
   * fud.formDataUpData(axios,'http://www.baidu.com',{
   *    name: 文件名,
   *    file: 文件流,
   *    ...
   * }).then(res=>{
   *  console.log(res)
   * }).catch(err=>{
   *  console.log(err)
   * })
   */
  formDataUpData(http, url, obj) {
    //set增加数据的时候会覆盖，form中是允许相同的name的
    //append增加数据的时候不会覆盖，form中是允许相同的name的
    //delete删除数据的
    //get/getAll获取对用key值的数据
    let formData = new FormData();
    for (let [key, value] of Object.entries(obj)) {
      if (key != "url") {
        formData.append(key, value);
      }
    }
    let headers = {};
    headers["Content-Type"] = "multipart/form-data";
    return new Promise((resolve, reject) => {
      http({
        method: "post",
        url: url,
        data: formData,
        headers: headers,
      })
        .then((res) => {
          resolve(res);
        })
        .catch((err) => {
          reject(err);
        });
    });
  }
  //#endregion

  //#region - 下载文件通过a标签-不传参
  downloadFileUseALabelIntroduce() {
    console.log(`
      功能:下载文件通过a标签
      method:get请求-不传参
      参数:
          fileName:文件名称
          URL:下载地址
          target:打开方式(当前页面打开:默认/新页面打开)
      返回值:无
      注意点:download属性只能在同域名下才能生效不然无效
      使用示例:
          fud.downloadFileUseALabel(下载文件名,下载地址,本页面打开(默认新界面打开))
    `);
  }
  /**
   * 功能:下载文件通过a标签
   * method:get请求-不传参
   * 参数:
   *    fileName:文件名称
   *    URL:下载地址
   *    target:打开方式=> _self:当前页面打开(默认)/_blank:新页面打开
   * 返回值:无
   * 注意点:download属性只能在同域名下才能生效不然无效
   */
  downloadFileUseALabel(filename, URL, target = "_self") {
    let DownloadLink = document.createElement("a");
    DownloadLink.style = "display: none";
    DownloadLink.target = target;
    DownloadLink.download = filename;
    DownloadLink.href = URL;
    document.body.appendChild(DownloadLink);
    DownloadLink.click();
    document.body.removeChild(DownloadLink);
    // <a target="view_window" href={`${configs.HTTP_BASE_URL}/system/fileUtil/exportFile/1003.do?unitId=${unitId}`}>下载</a>
    // window.location.href = configs.HTTP_BASE_URL + `/v2/api/weekly-report/executive-manager/export?periodId=${periodId}`
  }
  //#endregion

  //#region - 下载文件通过a标签-传参
  downloadFileUseALabelWithParamsIntroduce() {
    console.log(`
      功能:下载文件通过a标签
      method:get请求-传参(数据类型为对象)
      参数:
          fileName:文件名称
          URL:下载地址
          params:传给后端的参数对象
          target:打开方式=> _self:当前页面打开(默认)/_blank:新页面打开
      使用示例:
          fud.downloadFileUseALabelWithParams(下载文件名,下载地址,参数对象,本页面打开(默认新界面打开))
    `);
  }
  /**
   * 功能:下载文件通过a标签
   * method:get请求-传参
   * 参数:
   *    fileName:文件名称
   *    URL:下载地址
   *    params:传给后端的参数对象
   *    target:打开方式=> _self:当前页面打开(默认)/_blank:新页面打开
   * 返回值:无
   * 注意点:download属性只能在同域名下才能生效不然无效
   */
  downloadFileUseALabelWithParams(filename, URL, params, target = "_self") {
    if (this.judgeDataType(params) == "Object") {
      let pamStr = "";
      for (const k in paramsObj) {
        if (paramsObj[k]) {
          pamStr += k + "=" + paramsObj[k] + "&";
        }
      }
      pamStr = pamStr.substring(0, pamStr.length - 1);

      let DownloadLink = document.createElement("a");
      DownloadLink.style = "display: none";
      DownloadLink.target = target;
      DownloadLink.download = filename;
      pamStr = pamStr.substring(0, pamStr.length - 1);
      DownloadLink.href = `${URL}?${pamStr}`;
      document.body.appendChild(DownloadLink);
      DownloadLink.click();
      document.body.removeChild(DownloadLink);
    } else {
      console.error("你输入的参数不是Object数据类型,请检查...");
    }
  }
  //#endregion

  //#region - 下载文件通过form标签
  downloadFileUseFormLabelIntroduce() {
    console.log(`
      功能:下载文件通过form标签(不拆分params对象)
      参数:
          method:post请求
          url:下载地址
          params:参数对象
      返回值:无
      使用示例:
          fud.downloadFileUseFormLabel(下载地址,参数对象)
    `);
  }
  /**
   * 功能:下载文件通过form标签(不拆分params对象)
   * method:post请求
   * @param {*} url:下载地址
   * @param {*} params:参数
   * 返回值：无
   */
  downloadFileUseFormLabel(url, params) {
    if (this.judgeDataType(params) == "Object") {
      let formElement = document.createElement("form");
      formElement.target = "callBackTarget";
      formElement.style.display = "display:none;";
      formElement.method = "post";
      formElement.action = url;
      document.body.appendChild(formElement);

      let inputElement = document.createElement("input");
      inputElement.type = "hidden";
      inputElement.name = "params";
      inputElement.value = JSON.stringify(params);
      formElement.appendChild(inputElement);
      formElement.submit();
      document.body.removeChild(formElement);
    } else {
      console.error("你输入的参数不是Object数据类型,请检查...");
    }
  }
  //#endregion

  //#region - 下载文件通过form标签
  downloadFileUseFormLabelSplitParamsIntroduce() {
    console.log(`
      功能:下载文件通过form标签(拆分params对象)
      method:post请求
      参数:
          url:下载地址
          params:参数对象
      返回值:无
    `);
  }
  /**
   * 功能:下载文件通过form标签(拆分params对象)
   * method:post请求
   * @param {*} url:下载地址
   * @param {*} params:参数
   * 返回值：无
   */
  downloadFileUseFormLabelSplitParams(url, params) {
    if (this.judgeDataType(params) == "Object") {
      let form = document.createElement("form");
      form.style.display = "none";
      form.action = url;
      form.method = "post";
      document.body.appendChild(form);
      for (let key in params) {
        let input = document.createElement("input");
        input.type = "hidden";
        input.name = key;
        input.value = params[key];
        form.appendChild(input);
      }
      form.submit();
      form.remove();
    } else {
      console.error("你输入的参数不是Object数据类型,请检查...");
    }
  }
  //#endregion - 

  //#region - 下载文件通过Ajax请求(下载excel文件)
  downloadFileUseAjaxParamsIntroduce(){
    console.log(`
      功能:下载文件通过Ajax请求(下载excel文件)
      参数:
          http 发送Ajax请求库
          url 文件地址
          params 参数对象
          filename 文件名称
          target :打开方式=> _self:当前页面打开(默认)/_blank:新页面打开
      返回值:无
    `)
  }
  /**
   * 功能:下载文件通过Ajax请求(下载excel文件)
   * @param {*} http 发送Ajax请求库
   * @param {*} url 文件地址
   * @param {*} params 参数对象
   * @param {*} filename 文件名称
   * @param {*} target :打开方式=> _self:当前页面打开(默认)/_blank:新页面打开
   * 返回值:无
   */
  downloadFileUseAjaxParams(http,url,params,filename = "",target = "_self") {
    if (this.judgeDataType(params) == "Object") {
      return new Promise((resolve, reject) => {
        http({
          url: url,
          method: "post",
          data: params,
          responseType: "blob",
        })
          .then((res) => {
            const blob = new Blob([res], {
              type: "application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
            });
            const href = window.URL.createObjectURL(blob);
            this.downloadFileUseALabel(filename, href, target);
          })
          .catch((err) => {
            reject(err);
          });
      });
    } else {
      console.error("你输入的参数不是Object数据类型,请检查...");
    }
  }
  //#endregion
}
let fud = new fileUploadAndDownload();
export { fud };